#pragma once 

//////////////////////////////////////////

//已验证运行文件

//////////////////////////////////////////


/////////////////////////////
///循环队列定义

template <typename E,int M>
struct SqQueue
{
    E elem [M];
    int front,rear;
};

/////////////////////////
///循环队列的基本操作

///初始化循环对列为空
template <typename E,int M>
void InitQueue(SqQueue<E,M> &Q)
{
    Q.front = Q.rear = 0;
} 

///判断对列是否为空
template <typename E,int M>
bool QueueEmpty(const SqQueue<E,M> &Q)
{
    return Q.front  == Q.rear;
}

///入队列
template <typename E,int M>
void EnQueue(SqQueue<E,M> &Q, E e)
{
    //若队列满，则抛出异常文件
    if((Q.rear + 1) % M == Q.front) throw "异常";
    //否则e如对列
    Q.elem[Q.rear] = e;
    Q.rear = (Q.rear + 1) % M;

}

///出对列
template <typename E,int M>
void DeQueue(SqQueue <E,M> &Q,E &e)
{
    //若队列为空，则抛出异常
    if(Q.front == Q.rear) throw "Queue empty";
    //否则，则出队列
    e = Q.elem[Q.front];
    Q.front = (Q.front + 1) % M;

}

///出对列(不反悔头元素)
template <typename E,int M>
void DeQueue(SqQueue<E,M> &Q)
{
    //若队列为空，则抛出异常
    if(Q.front == Q.rear) throw "Queue empty";
    //否则，出对列
    Q.rear = (Q.rear + 1) % M;
}

///取对头元素GetHead（Q，&e）
template <typename E,int M>
void GetHead (const SqQueue<E,M> &Q, E &e)
{
    //若对列为空，则抛出异常
    if(Q.front == Q.rear) throw "Queue empty";
    //否则，返回对头元素
    e = Q.elem[Q.front];
}



///去头元素
template <typename E,int M>
E GetHead(const SqQueue<E,M> &Q)
{
    //若队列为空，则抛出异常
    if(Q.front == Q.rear) throw "Queue empty";
    //否则，返回头元素
    return Q.elem[Q.front];
}























































































